#pragma once
#include <iostream>
#include <cstdlib>
class Date
{

public:
    //友元函数
    friend std::ostream& operator<<(std::ostream& out ,const Date& d);
    friend std::istream& operator>>(std::istream& in,Date& d);

    // 构造函数
    Date(int year = 1999, int month = 1, int day = 1) : _year(year), _month(month), _day(day)
    {
        //检测日期是否合法
        if(!Check())
        {
            std::cout<<"创建日期非法!"<<std::endl;
            exit(1);
        }
    }
    
    bool Check()
    {
        if(_year < 0||_month <= 0||_month >= 13|| _day < 0||_day > GetMonthDay(_year,_month))
        {
            return false;
        }
        return true;
    }

     
    static void Fun()
    {
        std::cout<<"I am static fun"<<std::endl;
    }

    // //拷贝构造函数
    // Date(const Date& d)
    // {
    //     _year = d._year;
    //     _month = d._month;
    //     _day = d._day;
    // }

    void Print() const;
    int GetMonthDay(int year,int month);
    // 操作符重载
    Date &operator+=(int day);
    Date operator+(int day) const;
    Date &operator-=(int day);
    Date operator-(int day)const;
    int operator-(const Date& d)const;

    //操作符重载-比较
    bool operator>(const Date& d)const;
    bool operator==(const Date& d)const;
    bool operator<=(const Date& d)const;
    bool operator>=(const Date& d)const;
    bool operator<(const Date& d)const;
    bool operator!=(const Date& d)const;

    //操作符重载-前后置++--
    //前置++
    Date& operator++();
    //后置++
    Date operator++(int);

    // 操作符重载-赋值
    // 略-系统生成

    // 操作符重载-流插入流提取
    // 不能在类内实现



private:
    int _year;
    int _month;
    int _day;
};

